reftests: Ensure we got a draw event before quitting the main loop
authorBenjamin Otte <otte@redhat.com>
Thu, 5 May 2011 03:13:34 +0000 (05:13 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 5 May 2011 15:33:04 +0000 (17:33 +0200)
tests/reftests/gtk-reftest.c

index 111a4c900020f6ab833fcc7e430db5b5d515fdec..5b002f1a503f06f4dc88c6fc33bf1f90b5da5cac 100644 (file)
@@ -201,6 +201,18 @@ quit_when_idle (gpointer loop)
   return FALSE;
 }
 
+static void
+check_for_draw (GdkEvent *event, gpointer loop)
+{
+  if (event->type == GDK_EXPOSE)
+    {
+      g_idle_add (quit_when_idle, loop);
+      gdk_event_handler_set ((GdkEventFunc) gtk_main_do_event, NULL, NULL);
+    }
+
+  gtk_main_do_event (event);
+}
+
 static cairo_surface_t *
 snapshot_widget (GtkWidget *widget, SnapshotMode mode)
 {
@@ -217,7 +229,12 @@ snapshot_widget (GtkWidget *widget, SnapshotMode mode)
                                                gtk_widget_get_allocated_height (widget));
 
   loop = g_main_loop_new (NULL, FALSE);
-  g_idle_add (quit_when_idle, loop);
+  /* We wait until the widget is drawn for the first time.
+   * We can not wait for a GtkWidget::draw event, because that might not
+   * happen if the window is fully obscured by windowed child widgets.
+   * Alternatively, we could wait for an expose event on widget's window.
+   * Both of these are rather hairy, not sure what's best. */
+  gdk_event_handler_set (check_for_draw, loop, NULL);
   g_main_loop_run (loop);
 
   cr = cairo_create (surface);